Imports System.Data.SqlClient

Public Class cls_listaprecio_

    Implements ICloneable

#Region "Variables ..."
    Private int_idlistaprecio As Integer = 0
    Private dte_fecha As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private int_estado As enu_estado = enu_estado.Inactiva
    Private int_idregistro As Integer = 0
    Private str_nombre As String = ""
    Private str_descripcion As String = ""
    Private int_idcliente As Integer = 0
    Private int_tipo As enu_tipo

    Private obj_registro As cls_registro_
    Private obj_listaprecioarticulo As cls_listaprecioarticulo_
    Private obj_cliente As cls_cliente_

    Private col_Items As Collections.Generic.List(Of cls_listaprecio_) = Nothing
#End Region

    Public Enum enu_estado As Integer
        Activa = 0
        Inactiva = 1
    End Enum
    Public Enum enu_tipo As Integer
        General = 0
        Cliente = 1
    End Enum

    Public Overrides Function ToString() As String
        Return idlistaprecio & " Fecha: " & fecha.ToShortDateString & " - " & nombre
    End Function

#Region "Propiedades ..."
    ReadOnly Property This
        Get
            Return Me
        End Get
    End Property
    ReadOnly Property ThisDescripcion As String
        Get
            Return Me.ToString
        End Get
    End Property
    ReadOnly Property pKey
        Get
            Return idlistaprecio
        End Get
    End Property
    Property idlistaprecio() As Integer
        Get
            idlistaprecio = int_idlistaprecio
        End Get
        Set(ByVal value As Integer)
            int_idlistaprecio = value
        End Set
    End Property
    Property fecha() As DateTime
        Get
            fecha = dte_fecha
        End Get
        Set(ByVal value As DateTime)
            dte_fecha = value
        End Set
    End Property
    Property estado() As enu_estado
        Get
            estado = int_estado
        End Get
        Set(ByVal value As enu_estado)
            int_estado = value
        End Set
    End Property
    Property idregistro() As Integer
        Get
            idregistro = int_idregistro
        End Get
        Set(ByVal value As Integer)
            int_idregistro = value
        End Set
    End Property
    Property nombre As String
        Get
            nombre = str_nombre
        End Get
        Set(ByVal value As String)
            str_nombre = value
        End Set
    End Property
    Property descripcion As String
        Get
            descripcion = str_descripcion
        End Get
        Set(ByVal value As String)
            str_descripcion = value
        End Set
    End Property
    Property idcliente As Integer
        Get
            idcliente = int_idcliente
        End Get
        Set(value As Integer)
            int_idcliente = value
        End Set
    End Property
    Property tipo As enu_tipo
        Get
            tipo = int_tipo
        End Get
        Set(ByVal value As enu_tipo)
            int_tipo = value
        End Set
    End Property
    Property registro() As cls_registro_
        Get
            If IsNothing(obj_registro) Then
                obj_registro = New cls_registro_
                If Not obj_registro.Buscar(idregistro) Then
                    obj_registro = Nothing
                End If
            End If
            registro = obj_registro
        End Get
        Set(ByVal value As cls_registro_)
            obj_registro = value
        End Set
    End Property
    Property cliente() As cls_cliente_
        Get
            If IsNothing(obj_cliente) Then
                obj_cliente = New cls_cliente_
                If Not obj_cliente.Buscar(idcliente) Then
                    obj_cliente = Nothing
                End If
            End If
            cliente = obj_cliente
        End Get
        Set(ByVal value As cls_cliente_)
            obj_cliente = value
        End Set
    End Property
    Property listaprecioarticulo_() As cls_listaprecioarticulo_
        Get
            If IsNothing(obj_listaprecioarticulo) Then
                obj_listaprecioarticulo = New cls_listaprecioarticulo_
                If Not obj_listaprecioarticulo.CargarXidlistaprecio(int_idlistaprecio) Then
                    obj_listaprecioarticulo = Nothing
                End If
            End If
            listaprecioarticulo_ = obj_listaprecioarticulo
        End Get
        Set(ByVal value As cls_listaprecioarticulo_)
            obj_listaprecioarticulo = value
        End Set
    End Property

    Property Items() As Collections.Generic.List(Of cls_listaprecio_)
        Get
            Items = col_Items
        End Get
        Set(ByVal value As Collections.Generic.List(Of cls_listaprecio_))
            col_Items = value
        End Set
    End Property
#End Region

    Private Sub CargarColeccion(ByVal obj_Reader As SqlDataReader)
        col_Items = New Collections.Generic.List(Of cls_listaprecio_)
        While obj_Reader.Read()
            Dim Elemento As New cls_listaprecio_
            Elemento.int_idlistaprecio = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idlistaprecio")))

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
                Elemento.dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
                Elemento.int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
                Elemento.int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre"))) = False Then
                Elemento.str_nombre = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion"))) = False Then
                Elemento.str_descripcion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idcliente"))) = False Then
                Elemento.int_idcliente = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idcliente")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
                Elemento.int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
            End If
            col_Items.Add(Elemento)
        End While
    End Sub

    Private Sub CargarVariables(ByVal obj_Reader As SqlDataReader)
        obj_Reader.Read()
        int_idlistaprecio = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idlistaprecio")))

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
            dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
            int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
            int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre"))) = False Then
            str_nombre = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion"))) = False Then
            str_descripcion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idcliente"))) = False Then
            int_idcliente = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idcliente")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
            int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
        End If
    End Sub

    Public Function Nuevo(Optional ByVal ObtenerID As Boolean = False) As Boolean
        Nuevo = False
        Dim obj_Conexion As New cls_Conexion
        Try

            'Creacion de registro----------------------------------------------------
            If IsNothing(obj_registro) Then
                registro = New cls_registro_
                registro.fechacreado = Now
                registro.idusuariocreado = UsuarioLOG.idusuario
                registro.fechamodificado = Now
                registro.idusuariomodificado = UsuarioLOG.idusuario
                registro.idregistroestado = 1
                registro.idusuarioregistroestado = UsuarioLOG.idusuario
                registro.Nuevo(True)
                idregistro = obj_registro.idregistro
            End If
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__Nuevo"
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@nombre", SqlDbType.NVarChar).Value = str_nombre
                .Parameters.Add("@descripcion", SqlDbType.NVarChar).Value = str_descripcion
                .Parameters.Add("@idcliente", SqlDbType.Int).Value = int_idcliente
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .ExecuteNonQuery()
            End With
            Nuevo = True
            CargarUltimo()

            'Creacion de ProveedorArticulo--------------------------------------------------
            If Not IsNothing(listaprecioarticulo_) Then
                If Not IsNothing(listaprecioarticulo_.Items) Then
                    For Each listaprecioarticulo As cls_listaprecioarticulo_ In listaprecioarticulo_.Items
                        listaprecioarticulo.idlistaprecio = idlistaprecio
                        listaprecioarticulo.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Crear el registro de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Function

    Public Sub Modificar()
        Dim obj_Conexion As New cls_Conexion
        Try
            'Modificacion de registro------------------------------------------------
            registro.fechamodificado = Now : registro.idusuariomodificado = UsuarioLOG.idusuario
            registro.Modificar()
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__Modificar"
                .Parameters.Add("@idlistaprecio", SqlDbType.Int).Value = int_idlistaprecio
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@nombre", SqlDbType.NVarChar).Value = str_nombre
                .Parameters.Add("@descripcion", SqlDbType.NVarChar).Value = str_descripcion
                .Parameters.Add("@idcliente", SqlDbType.Int).Value = int_idcliente
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .ExecuteNonQuery()
            End With


            'Creacion/modificacion de proveedorarticulo-------------------------------------
            If Not IsNothing(listaprecioarticulo_) Then
                If Not IsNothing(listaprecioarticulo_.Items) Then
                    For Each listaprecioarticulo As cls_listaprecioarticulo_ In listaprecioarticulo_.Items
                        If listaprecioarticulo.idlistaprecioarticulo = 0 Then
                            listaprecioarticulo.idlistaprecio = idlistaprecio
                            listaprecioarticulo.Nuevo(True)
                        Else
                            listaprecioarticulo.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Modificar el registro de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Sub Eliminar(ByVal idlistaprecio As Integer)
        Dim obj_Conexion As New cls_Conexion
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__Eliminar"
                .Parameters.Add("@idlistaprecio", SqlDbType.Int).Value = idlistaprecio
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Eliminar el registro de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Function Buscar(ByVal idlistaprecio As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            Buscar = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__Buscar"
                .Parameters.Add("@idlistaprecio", SqlDbType.Int).Value = idlistaprecio
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                Buscar = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Buscar el registro de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Sub CargarUltimo()
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__CargarUltimo"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarUltimo registro de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Sub

    Public Function CargarTodos(Optional ByVal idregistroestado As Integer = 1) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodos = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__CargarTodos"
                .Parameters.Add("@idregistroestado", SqlDbType.Int).Value = idregistroestado
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodos = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodos los registros de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarXidcliente(ByVal idcliente As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXidcliente = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__CargarXidcliente"
                .Parameters.Add("@idcliente", SqlDbType.Int).Value = idcliente
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXidcliente = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXidcliente los registros de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function
    Public Function CargarXtipo(ByVal prm_int_tipo As enu_tipo) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXtipo = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "listaprecio__CargarXtipo"
                .Parameters.Add("@tipo", SqlDbType.Int).Value = prm_int_tipo
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXtipo = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXtipo los registros de listaprecio_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim obj_listaprecio_Clon As New cls_listaprecio_
        obj_listaprecio_Clon.int_idlistaprecio = Me.int_idlistaprecio
        obj_listaprecio_Clon.dte_fecha = Me.dte_fecha
        obj_listaprecio_Clon.int_estado = Me.int_estado
        obj_listaprecio_Clon.int_idregistro = Me.int_idregistro
        obj_listaprecio_Clon.str_nombre = Me.str_nombre
        obj_listaprecio_Clon.str_descripcion = Me.str_descripcion
        obj_listaprecio_Clon.int_idcliente = Me.int_idcliente
        obj_listaprecio_Clon.int_tipo = Me.int_tipo
        obj_listaprecio_Clon.col_Items = Me.col_Items
        Return obj_listaprecio_Clon
    End Function

End Class
